package com.lin.cloud.disk.common.aop;

import cn.hutool.core.bean.BeanUtil;
import cn.hutool.json.JSONUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.lin.cloud.disk.common.annotation.CompanyStatusAnnotation;
import com.lin.cloud.disk.common.enums.ECompanyEvent;
import com.lin.cloud.disk.common.enums.ECompanyStatus;
import com.lin.cloud.disk.common.exception.BusinessException;
import com.lin.cloud.disk.document.CompanyStatusDocument;
import com.lin.cloud.disk.entity.dto.UserDTO;
import com.lin.cloud.disk.entity.pojo.Company;
import com.lin.cloud.disk.service.ICompanyService;
import com.lin.cloud.disk.service.ICompanyStatusService;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import java.util.Date;
import java.util.Map;

/**
 * @author ljc
 * @date 2021/1/24 14:14
 */
@Slf4j
@Aspect
@Component
public class CompanyStatusAop {

    @Resource
    private ICompanyStatusService companyStatusService;
    @Resource
    private ICompanyService companyService;
    @Pointcut("@annotation(com.lin.cloud.disk.common.annotation.CompanyStatusAnnotation)")
    public void pointcutCompanyStatus() {
    }

    @Transactional
    @Around(value = "pointcutCompanyStatus()")
    public Object around(ProceedingJoinPoint pjp) throws Throwable {
        //此处joinPoint的实现类是MethodInvocationProceedingJoinPoint
        MethodSignature methodSignature = (MethodSignature) pjp.getSignature();
        // 获取方法上的注解
        CompanyStatusAnnotation annotation = methodSignature.getMethod().getAnnotation(CompanyStatusAnnotation.class);
        System.out.println(JSONUtil.toJsonStr(annotation));

        //  获取触发事件
        ECompanyEvent event = annotation.event();
        if (null == event || null == event.getOperator()) {
            throw new BusinessException("注解公司状态事件错误");
        }

        CompanyStatusDocument companyStatus = new CompanyStatusDocument();
        for (int i = 0; i < pjp.getArgs().length; i++) {
            JSONObject jsonObject = JSONObject.parseObject(JSON.toJSONString(pjp.getArgs()[i]));
            if (null != jsonObject.getObject("userDTO", UserDTO.class)) {
                UserDTO userDTO = jsonObject.getObject("userDTO", UserDTO.class);
                Map<String, Object> userDTOMap = BeanUtil.beanToMap(userDTO);
                // userDTOMap 移除companyId
                userDTOMap.remove("companyId");
                // 取出jsonObject已有的key 并从userDTOMap中移除
                jsonObject.keySet().forEach(key -> {
                    userDTOMap.remove(key);
                });
                // 最后加入userDTOMap
                jsonObject.putAll(userDTOMap);
            }

            //  设置公司名
            if (StringUtils.isBlank(companyStatus.getCompanyName()) && StringUtils.isNotBlank(jsonObject.getString("companyName"))) {
                companyStatus.setCompanyName(jsonObject.getString("companyName"));
            }
            // 设置公司ID
            if (null == companyStatus.getCompanyId() && null != jsonObject.getLong("companyId")) {
                companyStatus.setCompanyId(jsonObject.getLong("companyId"));
            }
            // 设置用户名
            if (StringUtils.isBlank(companyStatus.getCreateBy()) && (StringUtils.isNotBlank(jsonObject.getString("username")) || StringUtils.isNotBlank(jsonObject.getString("createBy")))) {
                if (StringUtils.isNotBlank(jsonObject.getString("username"))) {
                    companyStatus.setCreateBy(jsonObject.getString("username"));
                } else {
                    companyStatus.setCreateBy(jsonObject.getString("createBy"));
                }
            }
            //  设置反馈信息
            if (StringUtils.isBlank(companyStatus.getFeedbackMsg()) && StringUtils.isNotBlank(jsonObject.getString("feedbackMsg"))) {
                companyStatus.setFeedbackMsg(jsonObject.getString("feedbackMsg"));
            }
            //  设置状态
            if (null == companyStatus.getStatus() && null != jsonObject.getInteger("status")) {
                companyStatus.setStatus(jsonObject.getInteger("status"));
            }
        }

        // 没有状态 设置默认待审核状态
        if (null == companyStatus.getStatus()) {
            // 设置状态
            companyStatus.setStatus(ECompanyStatus.WAIT_REVIEW.getStatus());
        }
        // 设置创建时间
        companyStatus.setCreateTime(new Date());

        // 放行执行程序
        Object result = pjp.proceed();


        if (null != result) {
            if (result instanceof Long) {
                // 获取公司ID
                companyStatus.setCompanyId((Long) result);
            } else {
                // 得到结果 可能为新添加 返回了companyId 如果原本不存在重新获取一次
                JSONObject resultJson = null;
                resultJson = JSONObject.parseObject(JSON.toJSONString(result));

                // 获取公司ID
                if (null == companyStatus.getCompanyId() && null != resultJson.getLong("companyId")) {
                    companyStatus.setCompanyId(resultJson.getLong("companyId"));
                }
            }

        }

        // 最后的状态信息
        String lastStatusMessage = "";
        CompanyStatusDocument lastCompanyStatusInfo = companyStatusService.findLastCompanyStatusInfo(companyStatus.getCompanyId());
        if (null != lastCompanyStatusInfo) {
            Integer lastStatus = lastCompanyStatusInfo.getStatus();
            lastStatusMessage = ECompanyStatus.getStatusMessage(lastStatus);
            // 修改无公司名
            if (StringUtils.isBlank(companyStatus.getCompanyName())){
                companyStatus.setCompanyName(lastCompanyStatusInfo.getCompanyName());
                // 如果还查询不到 则查询数据库的
                if (StringUtils.isBlank(companyStatus.getCompanyName())) {
                    Company company = companyService.findById(companyStatus.getCompanyId());
                    companyStatus.setCompanyName(company.getCompanyName());
                }
            }
        }

        // 当前状态信息
        String nowStatusMsg = ECompanyStatus.getStatusMessage(companyStatus.getStatus());

        // 设置流转信息
        String circulationMsg = "";
        switch (event) {
            case INSERT:
                // 设置流转语
                circulationMsg = String.format("新添公司息: %s, 当前状态: %s", companyStatus.getCompanyName(), ECompanyStatus.WAIT_REVIEW.getMessage());
                break;
            case REMOVE:
                companyStatus.setStatus(ECompanyStatus.DELETE.getStatus());
                circulationMsg = String.format("下架公司: %s, 由 %s 转移到 %s", companyStatus.getCompanyName(), lastStatusMessage, ECompanyStatus.DELETE.getMessage());
                break;
            case UPDATE:
                circulationMsg = String.format("修改公司: %s, 由 %s 转移到 %s", companyStatus.getCompanyName(), lastStatusMessage, nowStatusMsg);
                break;
            default:
                throw new BusinessException("注解公司状态事件错误");

        }
        companyStatus.setCirculationMsg(circulationMsg);
        // 保存状态信息
        companyStatusService.saveCompanyStatus(companyStatus);
        // 如果是超级管理员 则跳过步骤

        // 修改公司状态信息 异步执行
        companyService.updateCompanyStatus(companyStatus);

        return result;
    }
}
